package ljl.alg.jianzhioffer.round2;

import java.util.Arrays;
import java.util.HashSet;

public class _61_is_straight {
    
    /*
    * 先算 0 个数，再算有几个 gap，如果 0 >= gap 就是？
    * */
    public boolean isStraight(int[] nums) {
        Arrays.sort(nums);
        int zeros = 0;
        while (nums[zeros] == 0) zeros++;
    
        int gap = 0;
        for (int j = zeros; j < nums.length - 1; j++) {
            int diff = nums[j + 1] - nums[j];
            // 第一次没考虑相等
            if (diff == 0) return false;
            // 第二次没考虑计算 gap 大小，只是自增
            if (diff > 1)
                // 第三次 diff 没 -1 导致结果不对
                gap += diff - 1;
        }
        return gap <= zeros;
    }
    
    /**
     * 路飞解法都是围绕 <5 来判断
     * 顺子需要有五张牌，如果是没大小王的顺子，最大最小差是 4
     * 满足了这个条件，还要满足不能有重复的牌
     * 有两个解法，
     * 1. 集合判断
     * 2. 遍历判断
     * */
    public boolean isStraight2(int[] nums) {
        HashSet<Integer> set = new HashSet<>();
        // 把这两个初始值写反了
        // 找了半天才找到，幸好只有几行，我掏他奶奶！
        int min = 14, max = 0;
        for (int num : nums) {
            if (num == 0) continue;
            min = Math.min(num, min);
            max = Math.max(num, max);
            boolean add = set.add(num);
            if (!add) return false;
        }
        return max - min < 5;
    }
    
    // 也是排序 遍历 最后判断 <5
    public boolean isStraight3(int[] nums) {
        Arrays.sort(nums);
        int zero = 0;
        for (int i = 0; i < nums.length - 1; i++) {
            if (nums[i] == 0) zero++;
            else if (nums[i] == nums[i + 1]) return false;
        }
        return nums[4] - nums[zero] < 5;
    }
}
